/**
 *  http 模块提供了两个函数 http.request  http.get，功能是作为客户端向 HTTP服务器发起请求。
 * http.request(options, callback) 发起 HTTP 请求。接受两个参数，option 是一个类似关联数组的对象，表示请求的参数，callback 是请求的回调函数。
 * option常用的参数如下所示。 http.request 返回一个 http.ClientRequest 的实例。
 */
var http = require("http");

/**
 * 参数配置
 * @type {{hostname: string, port: number, method: string, path: string,handers: {}}}
 * host:请求的服务器域名或者IP地址
 * port:端口
 * method:请求方式有POST,GET,INPUT,DELETE,CONNECT，默认为GET
 * path：请求地址，可包含查询字符串以及可能存在的锚点。例如'/index.html?page=12'
 * handers: 一个包含请求头的对象。
 */


var options =
{
    hostname : 'localhost',
    port : 8124,
    method : 'GET',
    path : '',
    handers:{
        'Connection': 'keep-alive',
        'Cache-Control': 'max-age=0',
        'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8',
        'Upgrade-Insecure-Requests': 1,
        'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/50.0.2661.102 Safari/537.36',
        'Accept-Encoding': 'gzip, deflate, sdch',
        'Accept-Language': 'zh-CN,zh;q=0.8'
    }
};



/**
 * 如下特别的消息头应当注意：
 * 发送'Connection: keep-alive'头部将通知Node此连接将保持到下一次请求。
 * 发送'Content-length'头将使默认的分块编码无效。
 * 发送'Expect'头部将引起请求头部立即被发送。
 * 通常情况，当发送'Expect: 100-continue'时，你需要监听continue事件的同时设置超时。参见RFC2616 8.2.3章节以获得更多的信息。
 */

/**
 * 说明：官方给出的例子
 * 应用场景：模拟客服端请求服务器，是一个HTTP 客户端工具，用于向 HTTP 服务器发起请求。
 * @param {Object} options
 * @param {Function} callback
 */
var req = http.request(options,function(res){
    console.log('STATUS:' + res.statusCode);
    console.log('HEADERS:' + JSON.stringify(res.headers));
    //res.setEncoding('utf8');
    res.on('data',function(chunk){
       console.log('BODY' + chunk);
    });
    
});

// req.on('response',function(){
//     console.log("response")
// });

// req.on('connect',function(){
//     console.log("connect")
// });

// req.on('socket',function(){
//     console.log("socket")
// });

// req.on('upgrade',function(){

// });

// req.on('continue',function(){
//     console.log("continue")
// })

//如果在请求过程中出现了错误（可能是DNS解析、TCP的错误、或者HTTP解析错误），返回的请求对象上的'error'的事件将被触发。
req.on('error',function(e){
   console.log(e.message);
});

/**
 * 源API：request.write(chunk, [encoding])
 * 说明：发送正文中的一块。用户可以通过多次调用这个方法将请求正文以流的方式发送到服务器。此种情况建议在建立请求时使用['Transfer-Encoding', 'chunked']请求头。
 * @param {Object or String} chunk 参数chunk应当是一个整数数组或字符串。
 * @param {String} encoding 参数encoding是可选的，仅在chunk为字符串时可用。
 */
//req.write('data\n');

/**
 * 源API：request.end(chunk, [encoding])
 * 说明：完成本次请求的发送。如果正文中的任何一个部分没有来得及发送，将把他们全部刷新到流中。如果本次请求是分块的，这个函数将发出结束字符'0\r\n\r\n'。如果使用参数data，就等于在调用request.write(data, encoding)之后紧接着调用request.end()。
 * @param {Object or String} chunk 参数chunk应当是一个整数数组或字符串。
 * @param {String} encoding 参数encoding是可选的，仅在chunk为字符串时可用。
 * example: req.end(),req.end('data\n'),req.end('data','utf8'),req.end(chunk)
 */
req.end();

/**
 * 阻止一个请求。（v0.3.8中新增的方法。）
 */
//req.abort();

/**
 * 源API：request.setTimeout(timeout, [callback])
 * 说明：一旦给这个请求分配的是一个socket时此函数会被调用
 * @param {Number} timeout 毫秒
 * @param {Function} callback 回到函数
 */
//req.setTimeout(1000,function(){});

/**
 * 源API :request.setNoDelay([noDelay])
 * 说明：默认有一定的延迟，设置为0表示无延迟
 * @param {Number} noDelay
 */
//req.setNoDelay(0)
/**
 * 源API：request.setSocketKeepAlive([enable], [initialDelay])
 *     类似同上
 */






// var http = require("http");
// var iconv = require('iconv-lite');
// var querystring = require("querystring");

// var imooc = "http://www.imooc.com/learn/348";
// var QQ = "http://www.qq.com";

// http.get(QQ,function(res){
//     console.log('status: ' + res.statusCode);
//     var chunk='';
//     res.on('data',function(data){
//         console.log(data);
//         chunk += data;
//         //console.log(chunk);
//     });
//     res.on('end',function(){
//         //var html = iconv.decode(chunk,'GBK');
//         //console.log(html);
//     })
// })


// var options = {
//     hostname:'www.imooc.com',
//     port: 80,
//     path: '/learn/348',
//     method: 'GET',
//     headers:{
//         'Accept':'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8',
//         'Accept-Encoding':'gzip, deflate, sdch',
//         'Accept-Language':'zh-CN,zh;q=0.8',
//         'Cache-Control':'max-age=0',
//         'Connection':'keep-alive',
//         'Cookie':'imooc_uuid=0cbb84e2-d50a-473a-8ab7-aee0a35ef7e3; imooc_isnew_ct=1471501057; loginstate=1; apsid=ZmMWRhYjNhNjZiZDM3Y2U0Zjc1YTQxNmFmYzBjN2QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMzg1MTMzMQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAyNDg4NTIyMzQ0QHFxLmNvbQAAAAAAAAAAAAAAAAAAADc2ZTFlYThiNGExN2MzOGU2ZTVlMmM4NzM5NTJkZWRhdcy2V3XMtlc%3DYW; last_login_username=2488522344%40qq.com; PHPSESSID=dr3dk7tv1o8ctn38b1vhaf9hr7; imooc_isnew=2; cvde=57bbc52ba13ae-3; Hm_lvt_f0cfcccd7b1393990c78efdeebff3968=1471501055,1471584513,1471586171,1471923496; Hm_lpvt_f0cfcccd7b1393990c78efdeebff3968=1471923525; IMCDNS=0',
//         'Host':'www.imooc.com',
//         'Upgrade-Insecure-Requests':'1',
//         'User-Agent':'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/50.0.2661.102 Safari/537.36',
//     }
// }


// http.request(options,function(res){
//     console.log('status' + res.statusCode);
//     console.log('headers' + JSON.stringify(res.headers));
//     res.on('data',function(chunk){
//         console.log(Buffer.isBuffer(chunk));
//         console.log(typeof chunk);
//     });
//     res.on('end',function(){
//         console.log("请求完成");
//     });
// }).on('error',function(e){
//     console.log("请求出错");
// });


